#include "Server.h"

// // 构造函数，初始化端口号和套接字描述符

// Server::Server(int port) : port(port), server_fd(-1), client_fd(-1) /*client_count(0)*/
// {
// 	// for (int i = 0; i < LIN_MAX; ++i)
// 	// {
// 	// 	sock_client_arr[i] = -1;
// 	// }
// }
// 关闭服务器和客户端连接
void Server::closeServer()
{
	// for (int i = 0; i < LIN_MAX; ++i)
	// {
	// 	if (sock_client_arr[i] >= 0)
	// 	{
	// 		close(sock_client_arr[i]); // 关闭客户端连接
	// 	}
	// }
	if (client_fd >= 0)
	{
		close(client_fd); // 关闭客户端连接
		client_fd = -1;
	}
	if (server_fd >= 0)
	{
		close(server_fd); // 关闭服务器套接字
	}
}

// 构造函数，初始化端口号和套接字描述符
Server::Server(int port) : port(port), server_fd(-1), client_fd(-1)
{
}

// 析构函数，关闭服务器以释放资源
Server::~Server()
{
	closeServer();
}

// 启动服务器，创建套接字并绑定和监听
bool Server::start()
{
	// 创建套接字，AF_INET 表示使用 IPv4 协议，SOCK_STREAM 表示使用 TCP
	server_fd = socket(AF_INET, SOCK_STREAM, 0);
	if (server_fd == -1)
	{
		cout << "创建服务端套接字失败" << endl;
		return false;
	}
	// 配置服务器地址结构
	sockaddr_in server_add;
	server_add.sin_family = AF_INET;
	server_add.sin_port = htons(port);
	// 表示允许任何地址连接  也可以是INADDR_ANY
	server_add.sin_addr.s_addr = inet_addr("0.0.0.0");

	// 与套接字绑定
	if (-1 == (bind(server_fd, (sockaddr *)&server_add, sizeof(server_add))))
	{
		cout << "绑定失败" << endl;
		// 关闭服务器的套接字
		close(server_fd);
		return false;
	}

	// 将服务器设置为监听状态  表示允许最大监听数量
	if (-1 == listen(server_fd, LIN_MAX))
	{
		cout << "监听失败" << endl;
		close(server_fd);
		return false;
	}
	// 监听成功  打印监听成功的端口号
	cout << "服务端正在监听的端口号：" << port << endl;
	return true;
}

// 接收客户端连接
bool Server::acceptClient()
{
	// 存储客户端的信息
	sockaddr_in client_add = {};
	socklen_t client_len = sizeof(client_add);

	// 接收客户端连接请求,阻塞等待直到有连接请求
	/*client_addr 结构体是由 accept 函数自动填充的，
	  server_fd 是一个已经绑定并处于监听状态的服务器套接字。*/
	client_fd = accept(server_fd, (sockaddr *)&client_add, &client_len);
	if (client_fd == -1)
	{
		cout << "客户端连接失败" << endl;
		return false;
	}

	// 连接成功打印 客户端连接成功
	cout << "客户端连接成功" << endl;
	send(client_fd, "恭喜连接成功", sizeof("恭喜连接成功"), 0);

	// for (int i = 0; i < LIN_MAX; ++i)
	// {
	// 	if (sock_client_arr[i] == -1)
	// 	{
	// 		sock_client_arr[i] = new_client_fd;
	// 		client_count++;
	// 		break;
	// 	}
	// }
	return true;
}

// 接收客户端发送的数据
string Server::receiveData()
{

	if (client_fd < 0)
	{
		cout << "没有客户端连接" << endl;
		return "";
	}

	// 缓冲区
	char buf[1024];
	memset(buf, 0, sizeof(buf));
	int byte;
	if (-1 == (byte = recv(client_fd, buf, sizeof(buf), 0)))
	{
		cout << "接收失败" << endl;
		return "";
	}

	// 接收成功，将接收的数据装换成字符串并返回
	return string(buf, byte);
}

// 向客户端发送数据
void Server::sendData(const std::string &data)
{
	// 检查是否有客户端连接
	if (client_fd < 0)
	{
		cout << "没有客户端连接" << endl;
	}

	// 如果有客户端连接
	send(client_fd, data.c_str(), data.size(), 0);
}

// 重载 << 操作符，向客户端发送数据
Server &Server::operator<<(const std::string &data)
{
	sendData(data);
	return *this;
}

// 重载 >> 操作符，从客户端接收数据
Server &Server::operator>>(std::string &data)
{
	data = receiveData();
	return *this;
}


